//==============================================================================
#include "Button.h"

//==============================================================================
ui::Button::Button( int posX, int posY, int width, int height) : Component(posX, posY, width, height)
{
	this->surf_pressed = NULL;
	this->surf_unPressed = NULL;
	this->pressed = false;
}
//------------------------------------------------------------------------------
ui::Button::Button( int posX, int posY, COMPONENT_TYPE type) : Component(posX, posY, 120, 40)
{
	this->surf_pressed = NULL;
	this->surf_unPressed = NULL;
	this->pressed = false;
	this->type = type;

    try
    {
        //Depediendo del tipo de botón elegido por parámetro se setean las superficies correspondientes
        switch (type)
        {
            case OPEN_BUTTON:{
                setSurface("./images/btn_open.png", "./images/btn_open_press.png");
            }
            break;

            case CLOSE_BUTTON:{
                setSurface("./images/btn_close.png", "./images/btn_close_press.png");
            }
            break;

            case CREATE_BUTTON:{
                setSurface("./images/btn_create.png", "./images/btn_create_press.png");
            }
            break;

            case REMOVE_BUTTON:{
                setSurface("./images/btn_remove.png", "./images/btn_remove_press.png");
            }
            break;

            case SAVE_BUTTON:{
                setSurface("./images/btn_save.png", "./images/btn_save_press.png");
            }
            break;

            case UPDATE_BUTTON:{
                setSurface("./images/btn_update.png", "./images/btn_update_press.png");
            }
            break;

            case CANCEL_BUTTON:{
                setSurface("./images/btn_cancel.png", "./images/btn_cancel_press.png");
            }
            break;

            case QUIT_BUTTON:{
                setSurface("./images/btn_quit.png", "./images/btn_quit_press.png");
            }
            break;

            case SCROLL_UP:{
                this->setSize(30,13);
                setSurface("./images/btn_scroll_up.png", "./images/btn_scroll_up_press.png");
            }
            break;

            case SCROLL_DOWN:{
                this->setSize(30,13);
                setSurface("./images/btn_scroll_down.png", "./images/btn_scroll_down_press.png");
            }
            break;

            case ACCEPT_BUTTON:{
                setSurface("./images/btn_accept.png", "./images/btn_accept_press.png");
            }
            break;

            default:{
                this->type = NONE;
            }
        }
    }
    catch( SDL_Exception &ex)
    {
        throw ex;
    }
}
//------------------------------------------------------------------------------
ui::Button::~Button(void)
{
	//Se liberan las superficies cargadas del botón
	SDL_FreeSurface( this->surf_pressed );
	SDL_FreeSurface( this->surf_unPressed );
}
//------------------------------------------------------------------------------
void ui::Button::setSurface(string path_ButtonUnPressed, string path_ButtonPressed)
{
	//Carga de las superficies del botón de acuerdo a la ruta recibida por parámetro
	if((this->surf_pressed = IMG_Load(path_ButtonPressed.c_str())) == NULL) {
	    std::string errorMessage ("BUTTON - LOAD SURFACE - ERROR");
	    throw( SDL_Exception(errorMessage));
	}
	else
		if((this->surf_unPressed = IMG_Load(path_ButtonUnPressed.c_str())) == NULL) {
            std::string errorMessage("BUTTON - LOAD SURFACE - ERROR");
            throw( SDL_Exception(errorMessage));
		}
}
//------------------------------------------------------------------------------
COMPONENT_TYPE ui::Button::handleEvent(SDL_Event* event)
{
	COMPONENT_TYPE type = NONE;

	//Si se presionó el boton izquierdo del mouse y el evento ocurrio dentro del área del componente se cambia el flag de presionado a verdadero
	if(event->type == SDL_MOUSEBUTTONDOWN && event->button.button == SDL_BUTTON_LEFT)
	{
        if(ocurredInside(event->button.x, event->button.y))
        {
            this->pressed = true;
        }
	}
	else
		//Si se soltó el botón izquierdo del mouse y el evento ocurrió dentro del área del componente el flag de presionado pasa a falso
		//Luego se seteará el tipo del botón al que le corresponde para ser devuelto, lo que derivará a una acción a realizar por el utilitario
		if( event->type == SDL_MOUSEBUTTONUP && event->button.button == SDL_BUTTON_LEFT
                && this->pressed == true)
        {
            if(ocurredInside(event->button.x, event->button.y))
            {
                 //acá se inicia la funcionalidad deseada : ABRIR, BORRAR, CREAR, SALIR
                 this->pressed = false;
				 type = this->type;
            }

        }else
			//Si el mouse se ha movido fuera del área del componente y el mismo se encontraba presionado, entonces es liberado
			if(event->type == SDL_MOUSEMOTION && this->pressed == true)
            {
                if( ! ocurredInside(event->motion.x, event->motion.y))
                {
                    this->pressed = false;
                }
            }
	return type;
}
//------------------------------------------------------------------------------
void ui::Button::draw(SDL_Surface* screen)
{
    SDL_Rect button_rect;

	button_rect.x = this->x_coordinate;
	button_rect.y = this->y_coordinate;
	button_rect.w = this->width;
	button_rect.h = this->height;

	SDL_Surface* button_surface;

	if(this->pressed)
	{
		button_surface = this->surf_pressed;
	}

	else
	{
		button_surface = this->surf_unPressed;
	}

	//Se dibuja la imagen superficial del boton
	if(SDL_BlitSurface(button_surface, NULL, screen, &button_rect))
	{
        std::string errorMessage ("BUTTON - BLIT SURFACE - ERROR");
	    throw SDL_Exception(errorMessage);
    }
}
//==============================================================================
